DevOps
CICD
K8s
Docker
KubeVirt
是由 Red Hat 於 2017 年初發起的一個容器虛擬化技術 Container-native Virtualization (CNV) 專案,它最主要的目的是讓 Kubernetes 以管理容器的角度來管理 VM
KubeVirt is a virtual machine management add-on for Kubernetes. The aim is to provide a common ground for virtualization solutions on top of Kubernetes
Source: https://github.com/kubevirt
KubeVirt
技術可滿足已採用或想要採用Kubernetes
但基於現有虛擬機的工作負載而無法輕易將其容器化的需求。也就是說,也許我今天並不想讓我的 infra 設備全部容器化,我可能需要VM的運算資源或更大的儲存空間,但我又想要像K8s管理Container一樣這麼方便的管理VM,那就需要透過KubeVirt
了。
KubeVirt可將application以Container或VM的形式佈署在相同的K8s環境中,使環境能兼具傳統VM only的Service及container-based的microservice架構
Source: https://www.youtube.com/watch?v=uusM5SyK-vc&ab_channel=KubeVirt
原先 K8s Pod 裡面的型態應該是 Container,但有了 Kubevirt
這樣的專案後,可以在 Pod 裡面run 起 VM 來讓使用者做使用
技術上來說這個 VM Instance 的實作是採用 KVM/QEMU
的方式進行使用,而他的資源配置方式則同樣採用 YAML 定義資源需求。KubeVirt
可以做到的事情包括:
這裡有一些KubeVirt的demo影片,有興趣的讀者可以參考看看~
接著我們介紹一下如何安裝KubeVirt
到 kubernetes 環境中
前面提到過的VM Insatnce是透過
KVM/QEMU
方式完成,因此像是KVM/QEMU
這類的prerequisite就必須先安裝到環境中,這邊就不贅述了KubeVirt安裝選擇目前最新的v0.33.0版本
$ export KUBEVIRT_VERSION=$(curl -s https://api.github.com/repos/kubevirt/kubevirt/releases/latest | jq -r .tag_name)
$ echo $KUBEVIRT_VERSION
jq
命令用於處理json檔案
安裝KubeVirt
$ kubectl create -f https://github.com/kubevirt/kubevirt/releases/download/${KUBEVIRT_VERSION}/kubevirt-operator.yaml
$ kubectl create -f https://github.com/kubevirt/kubevirt/releases/download/${KUBEVIRT_VERSION}/kubevirt-cr.yaml
建立一個 ConfigMap
,讓KubeVirt
使用軟體虛擬化的配置,而非使用實際的硬體虛擬化。
$ kubectl create configmap -n kube-system kubevirt-config --from-literal debug.useEmulation=true
檢查一共創立哪些物件
$ kubectl get po -n kubevirt
接著就可以透過KubeVirt
佈署VM了,我們先建立一個 test VM:
$ kubectl apply -f https://raw.githubusercontent.com/kubevirt/kubevirt.github.io/master/labs/manifests/vm.yaml
這時若用kubectl get po
查看,會發現沒有東西,這是因為VM雖然已經建立了,但是還沒被啟動,所以沒有Pod
也沒有vmis
,只有vms
$ kubectl get pods
No resources found.
$ kubectl get vms
NAME AGE
testvm 30s
$ kubectl get vmis
No resources found.
VM還沒啟動是因為YAML中定義的
running: false
那要如何啟動VM呢?要透過virtctl
,我們先安裝:
$ wget -O virtctl https://github.com/kubevirt/kubevirt/releases/download/${KUBEVIRT_VERSION}/virtctl-${KUBEVIRT_VERSION}-linux-amd64
$ chmod +x virtctl
接著,我們將VM啟動
$ ./virtctl start testvm
VM testvm was scheduled to start
## 等待VM Scheduling
$ kubectl get vmis
NAME AGE PHASE IP NODENAME
testvm 10s Scheduling
## VM Scheduling完成
$ kubectl get vmis
NAME AGE PHASE IP NODENAME
testvm 69s Running 10.244.0.15 g8node1
到這邊為止,就能成功run起VM囉~
若要停止此VM,可透過./virtctl stop <vm-name>
命令:
$ ./virtctl stop testvm
VM testvm was scheduled to stop
KubeVirt
可以算是未來Kubernetes的趨勢,它兼具了VM和Container的好處,且可以同時讓兩者在相同環境上一起運行,將來應該是很多企業導入微服務架構的過渡方案,而且現在已經很多企業開始用KubeVirt
了,大家有興趣花點時間看看吧~ 好啦,今天就到這囉~ 謝謝大家~
Getting to know KubeVirt in 2 minutes
Red Hat OpenShift 把 VM 當 Container 管!?
KubeVirt
KubeVirt on Kubernetes with CRI-O from scratch - Installing KubeVirt
You can find me on